package com.lj.demo.interceptor;

import com.lj.demo.invocation.Invocation;

import java.lang.reflect.InvocationTargetException;

/**
 * Title: 拦截器
 * Description:
 * Date: 2019年07月17日 15:51
 * @author lvjie
 * @version 1.0
 * Significant Modify：
 * Date                  Author                 Content
 * =================================================================
 * 2019年07月17日         lvjie         创建文件,实现基本功能
 * =================================================================
 */
public interface Interceptor {

    /**
     * 约定拦截器执行规则：
     *  1、首先执行before方法
     *  2、执行isUseAround方法，判断是否执行Around方法  true执行2.1  false执行2.2
     *      2.1、执行around方法
     *      2.2、执行target原有方法
     *  3、执行after方法  如果存在异常则执行3.1 否则执行3.2
     *      3.1、执行afterThrowing方法
     *      3.2、执行afterReturn方法
     */

    /**
     * 事前执行方法
     */
    boolean before();

    /**
     * 事后执行方法
     */
    void after();

    /**
     * 取代原有对象执行方法
     * @param invocation 回调参数，可以通过proceed方法执行原有方法逻辑
     * @return 目标对象执行结果
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    Object around(Invocation invocation) throws InvocationTargetException, IllegalAccessException;

    /**
     *  是否使用around取代原有方法
     * @return true取代   false不取代
     */
    boolean isUseAround();

    /**
     * 事后正常返回  执行的方法
     */
    void afterReturn();

    /**
     * 事后如果抛出异常  执行该方法
     */
    void afterThrowing();
}
